<?php
namespace App\Controller;

use app\model\User;
use think\facade\Db;
class DataTest{
    private $users;
    public function __construct(){
        $this->users = Db::name('user');
    }
    public function index(){
        //数据查询---------------------------------------------------
        //单个数据查询
        //查询整表数据
        // $users = Db::table('tp_user')->select();
        //查询表中一条数据，find：查找一条数据，没有查询到则返回null
        // $users = Db::table('tp_user')->where('id',257)->find();
        //Db::getLastSql()方法，可以得到最近一条SQL查询的原生语句
        // return Db::getLastSql();
        //查询表中一条数据，findOrFail：查找一条数据，没有查询到则抛出异常
        // $users = Db::table('tp_user')->where('id',257)->findOrFail();
        //查询表中一条数据，findOrEmpty：查找一条数据，没有查询到则返回空数组
        // $users = Db::table('tp_user')->where('id',257)->findOrEmpty();
        // return json($users);
        //数据集查询
            //获取多列数据，可以使用select()方法,无数据时返回空数组
            // $users = Db::table('tp_user')->select();//select * from 'tp_user';
            //获取多列数据，可以使用selectOrFail()方法,无数据时抛出异常
            // $users = Db::table('tp_user')->where('id',3)->selectOrFail();//select * from 'tp_user';
            // return json($users);
            //将数据集转化为数组
            // $users_arr = Db::table('tp_user')->select()->toArray();
            // dump($users_arr);
            //当数据库使用前缀时，可以用name()方法代替table()忽略前缀
            // $users_arr = Db::name('user')->select()->toArray();
            // dump($users_arr);
        //其他查询
            //1、通过value()方法，查询指定字段的值,只能是一条记录（多条返回第一个），没有时返回null
            // $users = Db:name('user')->where('id',24)->value('username');
            //2、通过column()方法，查询指定字段的值(返回键值对)，没有时返回null
            // $users = Db:name('user')->column('username','id');
            // return json($users);
            //3、chunk()方法分批处理数据，避免一次占用过多计算机资源
            // Db::connect('demo')->name('user')->chunk(3, function($users){
            //     // foreach($users as $user){
            //         dump($users);
            //     // }
            //     echo 1;
            // });
            //4、游标查询功能，可以大幅减少海量数据的内存开销，它利用PHP生成器特性。每次读一行，自动定位到下一行
            // $cursor = Db::connect('mysql')->name('user')->cursor();
            // foreach($cursor as $user){
            //     dump($user);
            // }
            //5、链式查询
            // $user = Db::name('user')->where('id',27)->order('id', 'desc')->select();
            // dump($user);
            //6、只有一个对象
            $userQuery = Db::name('user');
            // $dataSelect = $userQuery->select();
            // return json($dataSelect);
            //第一次设置的查询条件会保存到对象中
            $data1 = $userQuery->order('id', 'desc')->select();
            //第二个查询需要清除上一次保留的值
            $data2 = $userQuery->removeOption('order')->select();
            return Db::getLastSql();
        
    }
    public function demo(){
        $user = Db::connect('demo')->table('tp_book')->select();
        return json($user);
    }
    public function getUser(){
        $user=User::select();
        return json($user);
    }
    public function insert(){
        $data = [
            'id'        =>  312,
            'username'  =>  '辉夜',
            'password'  =>  '123',
            'gender'    =>  '女',
            'email'     =>  'huiye@163.com',
            'price'     =>  90,
            'details'   =>  '123',
            // 'abc'       =>  'def',
        ];
        //有不存在字段会报异常
        // return Db::name('user')->insert($data);
        // strict(false):忽略不存在的字段
        // return Db::name('user')->strict(false)->insert($data);
        // Db::name('user')->replace()->insert($data);
        // return Db::getLastSql();

        //使用insertGetID()方法，可以在新增成功后返回当前数据ID
        // return Db::name('user')->insertGetId($data);
        //save会根据id判断是覆盖还是新增
        return Db::name('user')->save($data);
    }
    public function insertAll(){
        $data = [
            [
                'username'  =>  '辉夜',
                'password'  =>  '123',
                'gender'    =>  '女',
                'email'     =>  'huiye@163.com',
                'price'     =>  90,
                'details'   =>  '123',
                // 'abc'       =>  'def',
            ],
            [
                'username'  =>  '辉夜',
                'password'  =>  '123456',
                'gender'    =>  '女',
                'email'     =>  'huiye@163.com',
                'price'     =>  90,
                'details'   =>  '123',
                // 'abc'       =>  'def',
            ]
        ];
        //新增
        // Db::name('user')->insertAll($data);
        //以替换的方式新增,id相同则替换
        Db::name('user')->replace()->insertAll($data);

    }

    public function update(){
        $data = [
            'id'            =>  311,
            'username'      =>  '硬核老王linux'
        ];
        
        // return $this->users->where('id', 312)->update($data);
        //$data中如果有主键，可以省略where
        // return '影响行数：'.$this->users->update($data);
        //如果需要执行SQL函数操作，可以使用exp()方法实现
        // return '影响行数：'.$this->users->where('id', 310)->exp('email', 'UPPER(email)')->update();
        // //如果要自增/自减某个字段，可以使用inc/dec方法，并支持自定义步长
        // return '影响行数：'.$this->users->where('id', 311)
        //                                 ->inc('price')
        //                                 ->dec('status',2)->update();
        //一个更加简单粗暴灵活的方式，使用::raw()方法实现函数和自增/减
        // return $this->users->where('id', 311)
        //         ->update([
        //             'email'     =>  Db::raw('UPPER(email)'),
        //             'price'     =>  Db::raw('price + 1'),
        //             'status'    =>  Db::raw('status + 1')
        //         ]);

        $this->users->where('id', 310)
                ->save([
                    'username'      =>      '李白'
                ]);
    }
    public function delete(){
        //删除一条
        //return $this->users->delete(310);
        //删除多条
        // return $this->users->delete([229, 230, 231]);
        //正常情况下通过where()方法删除
        // $this->users->where('id', 311)->delete();

    }

    public function query(){
        //比较查询（<>，<,>,>=,<=,=）
        //等于
        // $user = $this->users->where('id', '=', 312)->find();
        $user = $this->users->where('id', '<>', 312)->select();
        // return json($user);

        //区间查询
        //1、like
        // $user = $this->users->where('email', 'like', 'xiao%')->select();
        // $user = $this->users->where('email', 'like', ['xiao%','wu%'], 'or')->select();
        //2、between
        // $user = $this->users->where('id', 'between', [27,80])->select();
        //3、in
        // $user = $this->users->where('id', 'in', [25,26,29])->select();
        //4、null
        // $user = $this->users->where('uid', 'not null')->select();
        //5、exp查询（拼装）
        $user = $this->users->where('id', 'exp', 'IN (19,20,21)')->select();

        return json($user);
    }
    public function time(){
        // $user = $this->users->where('create_time', '>', '2018-01-01')->select();
        // $user = $this->users->where('create_time', 'between', ['2018-01-01', '2019-12-30'])->select();
        //查询今年数据
        // $user = $this->users->whereYear('create_time' )->select();
        //查询去年数据
        // $user = $this->users->whereYear('create_time', 'last year')->select();
        //查询指定年份
        // $user = $this->users->whereYear('create_time', '2016')->select();
        //查询指定月份
        // $user = $this->users->whereMonth('create_time', '2016-08')->select();
        // //查询指定某一天
        // $user = $this->users->whereDay('create_time', '2016-08-27')->select();
        //查询指定时间内的数据(查询两个小时内创建的用户)
        // $user = $this->users->whereTime('create_time', '-2 hours')->select();
        //有效期内的数据
        $user = $this->users->whereBetweenTimeField('create_time', 'update_time')->select();
        return Db::getLastsql();
        return json($user);
    }
    public function poly(){
        //聚合函数
        // $result =  $this->users->count();
        //只计算uid不为空的数据
        // $result =  $this->users->count('uid');
        //求价格最大最小值
        // $result =  $this->users->max('price');
        // $result =  $this->users->min('price');
        //false:不是数值，需要强制转换。字符串
        $result =  $this->users->min('email', false);
        // $result =  $this->users->avg('price');
        // $result =  $this->users->sum('price');
        //子查询
        //使用fetchsql()方法，可以设置不执行SQL，而返回SQL语句默认true
        // return $this->users->fetchSql(true)->select();
        // return $this->users->buildSql(true);

        //求出所有男的uid
        // $subQuery = Db::name('two')->field('uid')
        //                                 ->where('gender', '男')
        //                                 ->buildSql(true);
        //
        // $result =   Db::name('one')->where('id', 'exp', 'IN '.$subQuery)->select();

        //闭包子查询
        // $result = Db::name('one')->where('id', 'in', function($query){
        //     $query->name('two')->field('uid')->where('gender', '男');
        // });
        // return Db::getLastSql();
        // return json($result);

        //原生查询
        //使用query()方法，进行原生查询，适用于读取操作
        // return json(Db::query('select * from tp_user'));
        //使用execute()方法，进行原生查询，适用于新增或写入操作
        return json(Db::execute('update tp_user set username="孙悟空" where id=307'));
    }
    public function linkUp(){
        //关联数组查询
        // $data = $this->users->where([
        //     'gender'        =>  '男',
        //     'price'         =>100
        // ])->select();
        // $data = $this->users->where([
        //     ['gender','=',  '男'],
        //     ['price','>',100]
        // ])->select();
        $map[] = ['gender','=',  '男'];
        $map[] = ['price', 'in', [60, 70, 80]];
        // $data = $this->users->where($map)->select();
        // $data = $this->users->whereRaw('gender="男" AND price IN(60,70,80)')->select();
        // $data = $this->users->whereRaw('id=:id', ['id'=>19])->select();
        // $data =$this->users->field('id,username,password')->select();
        // $data =$this->users->fieldRaw('id, SUM(price)')->select();
        //设置显示行数
        $data =$this->users->limit(5)->select();
        //limit(offset, length):offset:偏移，length：显示行数
        $data =$this->users->limit(2,5)->select();
        // page()分页方法:第二页数据（6-10行）
        $data =$this->users->page(2,5)->select();

        //排序
        // $data =$this->users->order('price', 'desc')->page(2,5)->select();
        // $data =$this->users->order(['price' => 'desc', 'id' => 'desc'])->page(2,5)->select();
        //按用户名排序，并且樱桃小丸子排第一
        $data =$this->users->removeOption()->orderRaw('FIELD(username, "樱桃小丸子") DESC')->select();
        //group进行多字段分组统计
        $data = $this->users->removeOption()->fieldRaw('gender, SUM(price)')
                            ->group('gender, password')->select();
        //having:group分组之后筛选
        $data = $this->users->removeOption()->fieldRaw('gender, SUM(price)')
                            ->group('gender, password')
                            ->having('SUM(price) >= 90')
                            ->select();
                            // return Db::getLastSql();
        return json($data);
    }
}
